package org.diancai.diancai.controller;

import org.diancai.diancai.entity.User;
import org.diancai.diancai.service.UserService;
import org.diancai.diancai.utils.Result; // 自定义返回结果类（需提前创建）
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.security.access.prepost.PreAuthorize;
import org.springframework.security.core.Authentication;
import org.springframework.security.core.userdetails.UserDetails;
import org.springframework.security.crypto.password.PasswordEncoder;
import org.springframework.web.bind.annotation.*;

import java.util.List;

/**
 * 用户管理控制器：处理用户查询、修改、删除等操作
 * 接口路径：/api/user
 */
@RestController
@RequestMapping("/api/user")
public class UserController {

    @Autowired
    private UserService userService; // 注入用户服务

    @Autowired
    private PasswordEncoder passwordEncoder; // 密码加密器

    /**
     * 1. 查询所有用户（仅管理员可访问）
     * 权限要求：拥有"user:list"权限或管理员权限
     */
    @GetMapping("/list")
    @PreAuthorize("hasAnyAuthority('user:list', 'admin:all')") // 方法级权限控制
    public Result<List<User>> getAllUsers() {
        List<User> users = userService.list(); // MyBatis-Plus的list()方法查询所有
        return Result.success(users, "查询用户列表成功");
    }

    /**
     * 2. 根据ID查询用户（仅管理员或本人可访问）
     */
    @GetMapping("/{id}")
    public Result<User> getUserById(@PathVariable Integer id, Authentication authentication) {
        // 获取当前登录用户信息
        UserDetails currentUser = (UserDetails) authentication.getPrincipal();
        User targetUser = userService.getById(id); // 查询目标用户

        if (targetUser == null) {
            return Result.error("用户不存在");
        }

        // 权限校验：管理员可查所有用户，普通用户只能查自己
// UserController中对应的代码修正后：
        if (currentUser.getAuthorities().stream().anyMatch(a -> a.getAuthority().equals("admin:all"))
                || targetUser.getUsername().equals(currentUser.getUsername())) {
            // 调用新增的success方法（带数据和自定义消息）
            return Result.success(targetUser, "查询用户成功");
        } else {
            // 调用forbidden方法（无权限，返回403）
            return Result.forbidden("无权限查询该用户");
        }
    }
        /**
         * 3. 修改用户密码（登录用户可修改自己的密码）
         */
        @PutMapping("/updatePassword")
        public Result<?> updatePassword(@RequestBody PasswordUpdateDTO dto, Authentication authentication) {
            // 获取当前登录用户名
            String username = authentication.getName();
            User user = userService.getByUsername(username);

            // 校验原密码是否正确
            if (!passwordEncoder.matches(dto.getOldPassword(), user.getPassword())) {
                return Result.error("原密码错误");
            }

            // 加密新密码并更新
            user.setPassword(passwordEncoder.encode(dto.getNewPassword()));
            boolean success = userService.updateById(user);

            return success ? Result.success(null, "密码修改成功") : Result.error("密码修改失败");
        }

        /**
         * 4. 禁用/启用用户（仅管理员可操作）
         */
        @PutMapping("/updateStatus/{id}")
        @PreAuthorize("hasAuthority('admin:all')") // 仅管理员可访问
        public Result<?> updateUserStatus(@PathVariable Integer id, @RequestParam Integer status) {
            User user = new User();
            user.setId(id);
            user.setStatus(status); // 1=启用，0=禁用
            boolean success = userService.updateById(user);
            return success ? Result.success(null, "用户状态更新成功") : Result.error("用户状态更新失败");
        }

        /**
         * 内部静态类：接收密码修改请求参数
         */
        public static class PasswordUpdateDTO {
            private String oldPassword; // 原密码
            private String newPassword; // 新密码

            // getter和setter
            public String getOldPassword() { return oldPassword; }
            public void setOldPassword(String oldPassword) { this.oldPassword = oldPassword; }
            public String getNewPassword() { return newPassword; }
            public void setNewPassword(String newPassword) { this.newPassword = newPassword; }
        }
    }